﻿//
// GrepEngine
//
// Copyright (C) 2011 - Tatsuya Niioka
//
using System;
using System.IO;
using System.Runtime.Serialization;

namespace GrepEngine
{
    /// <summary>
    /// Grep情報クラス
    /// </summary>
    [Serializable]
    public class GrepInfo : ISerializable
    {
        #region Description
        private string m_description;
        /// <summary>
        /// 概要を取得または設定します。
        /// </summary>
        public string Description
        {
            get { return m_description; }
            set { m_description = value; }
        }
        #endregion

        #region Path
        private string m_path;
        /// <summary>
        /// パスを取得または設定します。
        /// </summary>
        public string Path
        {
            get { return m_path; }
            set { m_path = value; }
        }
        #endregion

        #region SearchPattern
        private string m_searchPattern;
        /// <summary>
        /// 検索パターンを取得または設定します。
        /// </summary>
        public string SearchPattern
        {
            get { return m_searchPattern; }
            set { m_searchPattern = value; }
        }
        #endregion

        #region InputEncodingName
        private InputEncodingMode m_inputEncodingName = InputEncodingMode.Auto;
        /// <summary>
        /// 入力エンコーディング名を取得または設定します。
        /// </summary>
        public InputEncodingMode InputEncodingName
        {
            get { return m_inputEncodingName; }
            set { m_inputEncodingName = value; }
        }
        #endregion

        #region OutputEncodingName
        private OutputEncodingMode m_outputEncodingName = OutputEncodingMode.None;
        /// <summary>
        /// 出力エンコーディング名を取得または設定します。
        /// </summary>
        public OutputEncodingMode OutputEncodingName
        {
            get { return m_outputEncodingName; }
            set { m_outputEncodingName = value; }
        }
        #endregion

        #region SearchOption
        private SearchOption m_searchOption = SearchOption.AllDirectories;
        /// <summary>
        /// 検索オプションを取得または設定します。
        /// </summary>
        public SearchOption SearchOption
        {
            get { return m_searchOption; }
            set { m_searchOption = value; }
        }
        #endregion

        #region SearchValue
        private string m_searchValue;
        /// <summary>
        /// 検索文字列を取得または設定します。
        /// </summary>
        public string SearchValue
        {
            get { return m_searchValue; }
            set { m_searchValue = value; }
        }
        #endregion

        #region ReplacementValue
        private string m_replacementValue;
        /// <summary>
        /// 置換文字列を取得または設定します。
        /// </summary>
        public string ReplacementValue
        {
            get { return m_replacementValue; }
            set { m_replacementValue = value; }
        }
        #endregion

        #region OutputLineEnd
        private OutputLineEnd m_outputLineEnd = OutputLineEnd.None;
        /// <summary>
        /// 出力改行コードを取得または設定します。
        /// </summary>
        public OutputLineEnd OutputLineEnd
        {
            get { return m_outputLineEnd; }
            set { m_outputLineEnd = value; }
        }
        #endregion

        #region Mode
        private GrepMode m_mode = GrepMode.Grep;
        /// <summary>
        /// 処理モードを取得または設定します。
        /// </summary>
        public GrepMode Mode
        {
            get { return m_mode; }
            set { m_mode = value; }
        }
        #endregion

        #region IsIgnoreCase
        private bool m_isIgnoreCase = false;
        /// <summary>
        /// 大文字小文字区別を取得または設定します。
        /// </summary>
        public bool IsIgnoreCase
        {
            get { return m_isIgnoreCase; }
            set { m_isIgnoreCase = value; }
        }
        #endregion

        #region IsWord
        private bool m_isWord = false;
        /// <summary>
        /// ワード
        /// </summary>
        public bool IsWord
        {
            get { return m_isWord; }
            set { m_isWord = value; }
        }
        #endregion

        #region IsConditions
        private bool m_isConditions = false;
        /// <summary>
        /// 検索条件状態を取得または設定します。
        /// </summary>
        public bool IsConditions
        {
            get { return m_isConditions; }
            set { m_isConditions = value; }
        }
        #endregion

        #region ConditionsMode
        private ConditionsMode m_conditionsMode = ConditionsMode.Regex;
        /// <summary>
        /// 検索条件を取得または設定します。
        /// </summary>
        public ConditionsMode ConditionsMode
        {
            get
            {
                return m_conditionsMode;
            }
            set
            {
                m_conditionsMode = value;
            }
        }
        #endregion

        #region IsRepeart
        private bool m_isRepeart = false;
        /// <summary>
        /// 反復処理状態を取得または設定します。
        /// </summary>
        public bool IsRepeart
        {
            get { return m_isRepeart; }
            set { m_isRepeart = value; }
        }
        #endregion

        #region IndentConvertMode
        private IndentConvertMode m_indentConvertMode = IndentConvertMode.Space;
        /// <summary>
        /// インデント変換モードを取得または設定します。
        /// </summary>
        public IndentConvertMode IndentConvertMode
        {
            get { return m_indentConvertMode; }
            set { m_indentConvertMode = value; }
        }
        #endregion

        #region TabSize
        private int m_tabSize = 3;
        /// <summary>
        /// タブサイズを取得または設定します。
        /// </summary>
        public int TabSize
        {
            get { return m_tabSize; }
            set { m_tabSize = value; }
        }
        #endregion

        #region IsOutputPath
        private bool m_isOutputPath;
        /// <summary>
        /// 出力先変更状態を取得または設定します。
        /// </summary>
        public bool IsOutputPath
        {
            get { return m_isOutputPath; }
            set { m_isOutputPath = value; }
        }
        #endregion

        #region OutputPath
        private string m_outputPath;
        /// <summary>
        /// 出力フォルダを取得または設定します。
        /// </summary>
        public string OutputPath
        {
            get { return m_outputPath; }
            set { m_outputPath = value; }
        }
        #endregion

        #region Constructors
        /// <summary>
        /// 新しいクラスを生成します。
        /// </summary>
        public GrepInfo()
        {
        }
        /// <summary>
        /// 指定した<see cref="SerializationInfo"/>、<see cref="StreamingContext"/>クラスで新しい<see cref="GrepInfo"/>クラスを生成します。
        /// </summary>
        /// <param name="info">シリアル化情報が取得されるオブジェクト。</param>
        /// <param name="context">シリアル化の対象コンテキスト。</param>
        protected GrepInfo(SerializationInfo info, StreamingContext context)
        {
            Description = (string)info.GetString("Description");
            Path = (string)info.GetString("Path");
            SearchPattern = (string)info.GetString("SearchPattern");
            SearchValue = (string)info.GetString("SearchValue");
            ReplacementValue = (string)info.GetString("ReplacementValue");
            try
            {
                InputEncodingName = (InputEncodingMode)Enum.Parse(typeof(InputEncodingMode), info.GetString("InputEncodingName"));
            }
            catch
            {
                InputEncodingName = InputEncodingMode.Auto;
            }
            try
            {
                OutputEncodingName = (OutputEncodingMode)Enum.Parse(typeof(OutputEncodingMode), info.GetString("OutputEncodingName"));
            }
            catch
            {
                OutputEncodingName = OutputEncodingMode.None;
            }
            IsOutputPath = (bool)info.GetBoolean("IsOutputPath");
            OutputPath = (string)info.GetString("OutputPath");
            try
            {
                OutputLineEnd = (OutputLineEnd)Enum.Parse(typeof(OutputLineEnd), info.GetString("OutputLineEnd"));
            }
            catch
            {
                OutputLineEnd = OutputLineEnd.None;
            }
            SearchOption = (SearchOption)Enum.Parse(typeof(SearchOption), info.GetString("SearchOption"));
            try
            {
                Mode = (GrepMode)Enum.Parse(typeof(GrepMode), info.GetString("Mode"));
            }
            catch
            {
                Mode = GrepMode.Grep;
            }

            IsIgnoreCase = info.GetBoolean("IsIgnoreCase");
            IsWord = info.GetBoolean("IsWord");
            IsConditions = info.GetBoolean("IsConditions");
            try
            {
                ConditionsMode = (ConditionsMode)Enum.Parse(typeof(ConditionsMode), info.GetString("ConditionsMode"));
            }
            catch
            {
                ConditionsMode = ConditionsMode.Regex;
            }

            IsRepeart = info.GetBoolean("IsRepeart");
            try
            {
                IndentConvertMode = (IndentConvertMode)Enum.Parse(typeof(IndentConvertMode), info.GetString("IndentConvertMode"));
            }
            catch
            {
                IndentConvertMode = IndentConvertMode.Space;
            }
            TabSize = info.GetInt32("TabSize");
        }
        #endregion

        #region ISerializable
        /// <summary>
        /// <see cref="SerializationInfo"/> に、オブジェクトをシリアル化するために必要なデータを設定します。
        /// </summary>
        /// <param name="info"></param>
        /// <param name="context"></param>
        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Description", Description);
            info.AddValue("Path", Path);
            info.AddValue("SearchValue", SearchValue);
            info.AddValue("ReplacementValue", ReplacementValue);
            info.AddValue("SearchPattern", SearchPattern);
            info.AddValue("InputEncodingName", InputEncodingName);
            info.AddValue("OutputEncodingName", OutputEncodingName);
            info.AddValue("IsOutputPath", IsOutputPath);
            info.AddValue("OutputPath", OutputPath);
            info.AddValue("OutputLineEnd", OutputLineEnd);
            info.AddValue("SearchOption", SearchOption.ToString());
            info.AddValue("Mode", Mode.ToString());

            info.AddValue("IsIgnoreCase", IsIgnoreCase);
            info.AddValue("IsWord", IsWord);
            info.AddValue("IsConditions", IsConditions);
            info.AddValue("ConditionsMode", ConditionsMode.ToString());

            info.AddValue("IsRepeart", IsRepeart);
            info.AddValue("IndentConvertMode", IndentConvertMode.ToString());
            info.AddValue("TabSize", TabSize);
        }
        #endregion
    }
}
